#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <ctime>
#include "Task.hpp"
#include"log.hpp"
#include"pthreadpoul.hpp"
// class threaddata
// {
// public:
//     threaddata()
//     {
//         tp = new BlockQueue<Task>();
//     }
//     string getname()
//     {
//         char a[64];
//         snprintf(a, sizeof(a), "%s-%d", "name", cnt);
//         cnt++;
//         return a;
//     }
//     ~threaddata()
//     {
//     }
//     string _threadname;
//     BlockQueue<Task> *tp=nullptr;
//     int cnt = 1;
// };
// using namespace std;
// void *productRoutine(void *arg)
// {
//     threaddata *td = (threaddata *)arg;
//     string name=td->getname();
//     while (true)
//     {
//         int data1 = rand() % 10;
//         sleep(1);
//         int data2 = rand() % 10;
//         sleep(1);
//         char oper = operachar[rand() % operachar.size()];
//         Task t(data1, data2, oper);
//          cout<<name<<" "
//              << "productor task"<<":";
//         t.prdduct();
//         td->tp->push(t);
//         sleep(1);
//     }
//     return nullptr;
// }
// void *customRoutine(void *arg)
// {
//     threaddata *td = (threaddata *)arg;
//     string name=td->getname();
//     while (true)
//     {
//         Task t;
//         td->tp->pop(&t);
//         t();
//         cout<<name<<" "<<
//               "consumer data"<<":";
//         t.custom();
//     }
//     return nullptr;
// }

int main()
{
    // pthread_t t1, t2;
    // BlockQueue<int> *td = new BlockQueue<int>();
    // pthread_create(&t1, nullptr, productRoutine, td);
    // pthread_create(&t2, nullptr, productRoutine, td);
    // pthread_join(t1, nullptr);
    // pthread_join(t2, nullptr);
    // srand((size_t)time(nullptr) ^ getpid() ^ pthread_self());
    // pthread_t c[2], p[3];
    // threaddata *td = new threaddata();
    // // BlockQueue<Task> *td = new BlockQueue<Task>();
    // pthread_create(&c[0], nullptr, customRoutine, td);
    // pthread_create(&c[1], nullptr, customRoutine, td);
    // pthread_create(&p[0], nullptr, productRoutine, td);
    // pthread_create(&p[1], nullptr, productRoutine, td);
    // pthread_create(&p[2], nullptr, productRoutine, td);
    // pthread_join(c[0], nullptr);
    // pthread_join(c[1], nullptr);
    // pthread_join(p[0], nullptr);
    // pthread_join(p[1], nullptr);
    // pthread_join(p[2], nullptr);
    // string name="主线程";
    //sleep(10);
    Threadpool<Task>::GetInstance()->start();
    srand((uint64_t)time(nullptr) ^ getpid());

    // lg.massage(Debug,"%s is runing\n",name.c_str());
    while(true)
    {
        int x = rand() % 100 + 1;
        //usleep(1234);
        int y = rand() % 200;
        //usleep(1234);
        char oper = operachar[rand() % operachar.size()];
        Task s(x,y,oper);
        Threadpool<Task>::GetInstance()->push(s);
        sleep(1);
    }
    Threadpool<Task>::GetInstance()->Wait();
    return 0;
}